// ==UserScript==
// @name         会务系统辅助工具-前端
// @namespace    https://*********
// @version      20251119
// @description  会务系统辅助工具
// @author       温绍杰20251119
// @match        https://*********/index/page/index.html
// @match        https://*********/vcmeet/page/receivedmtindex.html
// @match        https://*********/vcmeet/page/receivedmt2index.html
// @match        http://*********/admin.php?ac=add&fileurl=apps&tplid=1&tpltype=1&*
// @match        http://*********/admin.php?ac=add&fileurl=apps&appid*
// @match        http://*********/admin.php?ac=list&fileurl=apps
// @match        http://*********/newstart.php*
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function () {
    'use strict';
    //console.log("脚本运行");
    const currentUrl = window.location.href;
    //console.log("当前完整 URL:", currentUrl);

    function handleTitle(title) {
        title = title.replace('  未阅  ( 下载 ||  预览  )标记 || 上OA', '');
        title = title.replace('  未阅  ( 下载 ||  预览  )取消标记 || 上OA', '')
        title = title.replace('  ( 下载 ||  预览  )标记 || 上OA', '');
        title = title.replace('  ( 下载 ||  预览  )取消标记 || 上OA', '')
        return title
    }

    async function fetchReceiverList() {
        try {
            const response = await fetch('http://127.0.0.1:7788/monitor/getMails'); // 替换为你的后端 API 端点
            if (!response.ok) {
                throw new Error('网络响应不正常');
            }
            const data = await response.json();
            const receiver_list = data['receiver_list'];

            const mails = prompt("当前已设置提醒的邮箱：\n" + receiver_list + "\n请输入提醒邮箱（多个邮箱用,隔开）:", "");
            console.log("设置邮箱：" + mails)
            if (mails == null) { return }

            fetch('http://127.0.0.1:7788/monitor/setMails', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ mails: mails })
            }).then(response => {
                if (!response.ok) {
                    throw new Error(`HTTP error! Status: ${response.status}`);
                }
                return response.json(); // 假设服务器返回 JSON，不能少，否则无法获取data
            })
                .then(data => {
                    if (data['status'] == 'success') {
                        console.log('设置成功:', data);
                        alert('设置提醒邮箱成功')
                    } else {
                        console.log('设置失败:', data);
                        alert('设置提醒邮箱失败')
                    }
                    // 在这里添加通知处理结果的逻辑（如更新 UI 或显示提示）
                })
                .catch(error => {
                    console.error('请求失败:', error);
                    alert('后端未启动或程序出错')
                })

        } catch (error) {
            console.error('获取邮箱数据失败:', error);
            throw error; // 可以选择重新抛出错误或处理它
        }
    }

    function update_huiwu_file(huiwu_cookie, pageNum, isAuto, mode) {
        const oa_cookie = GM_getValue('oa_cookie')
        if (oa_cookie == null) {
            alert("登录oa才可查询公文的责任科室（若已登录，请刷新oa页面）")
        }
        alert("请稍等")
        const response_huiwu = fetch('http://127.0.0.1:7788/update/huiwu/doc', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ oa_cookie: oa_cookie, huiwu_cookie: huiwu_cookie, pageNum: pageNum, isAuto: isAuto, mode: mode })
        }).then(response => {
            if (!response.ok) {
                throw new Error(`HTTP error! Status: ${response.status}`);
            }
            return response.json(); // 假设服务器返回 JSON，不能少，否则无法获取data
        })
            .then(data => {
                if (data['status'] == 'success') {
                    console.log('更新成功:', data);
                    alert('会务收文本更新成功')
                } else {
                    console.log('更新失败:', data);
                    alert('会务收文本更新失败')
                }
                // 在这里添加通知处理结果的逻辑（如更新 UI 或显示提示）
            })
            .catch(error => {
                console.error('请求失败:', error);
                alert('后端未启动或程序出错')
                // 在这里添加错误处理逻辑（如显示错误提示）
            });
    }

    function update_oa_file(oa_cookie, pageNum, isAuto) {
        if (oa_cookie == null) {
            alert("登录oa才可查询公文的责任科室（若已登录，请刷新oa页面）")
        }
        alert("请稍等")
        const response_huiwu = fetch('http://127.0.0.1:7788/update/oa/doc', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ oa_cookie: oa_cookie, pageNum: pageNum, isAuto: isAuto })
        }).then(response => {
            if (!response.ok) {
                throw new Error(`HTTP error! Status: ${response.status}`);
            }
            return response.json(); // 假设服务器返回 JSON，不能少，否则无法获取data
        })
            .then(data => {
                if (data['status'] == 'success') {
                    console.log('更新成功:', data);
                    alert('OA收文本更新成功')
                } else {
                    console.log('更新失败:', data);
                    alert('OA收文本更新失败')
                }
                // 在这里添加通知处理结果的逻辑（如更新 UI 或显示提示）
            })
            .catch(error => {
                console.error('请求失败:', error);
                alert('后端未启动或程序出错')
                // 在这里添加错误处理逻辑（如显示错误提示）
            });
    }

    //设置收文监控
    function setMonitorHuiwu() {

        const table = document.querySelector('#example');
        if (table) {
            const dataRows = table.querySelectorAll('tbody tr');
            // console.log(dataRows)
            const firstTd = dataRows[0].querySelector('td');
            const spanElement = firstTd.querySelector('span');
            const titValue = spanElement.getAttribute('tit');
            console.log('文件监控', titValue);

            const response_huiwu = fetch('http://127.0.0.1:7788/monitor/huiwu', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ huiwu_cookie: document.cookie, initRkey: titValue })
            }).then(response => {
                if (!response.ok) {
                    throw new Error(`HTTP error! Status: ${response.status}`);
                }
                return response.json(); // 假设服务器返回 JSON，不能少，否则无法获取data
            })
                .then(data => {
                    if (data['monitorHw'] == 'running') {
                        console.log('监控已开启');
                    }
                    // 在这里添加通知处理结果的逻辑（如更新 UI 或显示提示）
                })
                .catch(error => {
                    console.error('请求失败，请检查后端程序是否启动或是否出错', error);
                    // 在这里添加错误处理逻辑（如显示错误提示）
                });
        }
    }

    if (currentUrl == 'https://*********/vcmeet/page/receivedmtindex.html') {

        let markdata = JSON.parse(sessionStorage.getItem("markdata")) || [];
        // 获取所有行
        setTimeout(() => {
            setMonitorHuiwu()
            /**
            //添加关闭辅助工具
            const title = document.getElementById('title');
            const swtich = document.createElement("a");
            swtich.href = "javascript:void(0);"; // 防止默认跳转行为
            swtich.style.color = '#007DDB'
            swtich.id = 'swtich'
            swtich.textContent = "关闭辅助工具";
            swtich.onclick = function() {
                window.open('https://gitee.com/shaw1030/zqkjj-huiwu/blob/master/switch.png', '_blank');
            }
            title.parentNode.replaceChild(swtich, title.nextSibling);
            **/

            // 设置提醒邮箱
            const title = document.getElementById('title');
            const swtich = document.createElement("a");
            swtich.href = "javascript:void(0);"; // 防止默认跳转行为
            swtich.style.color = '#007DDB'
            swtich.id = 'swtich'
            swtich.textContent = "设置提醒邮箱";
            swtich.onclick = function () {
                // 调用函数并处理结果
                fetchReceiverList()
            }
            title.parentNode.replaceChild(swtich, title.nextSibling);

            //添加更新收文本
            const huiwu_cookie = document.cookie
            const btElement = document.getElementById('zb');
            if (btElement) {
                const update_doc = document.createElement("button");
                update_doc.innerHTML = "<i class='fa fa-arrow-circle-o-down mr8'></i>导出收文本";
                update_doc.id = 'updateDoc'
                update_doc.classList.add("news-btn");
                update_doc.classList.add("news-btn-blue");
                update_doc.onclick = function () {
                    let pageNum = prompt("建议文件全部处理完后再导出。\n请输入页码（如 1-9 或 3 ）:", "");
                    console.log("pageNum：" + pageNum)
                    if (pageNum == '' || pageNum === null) {
                        return
                    }
                    update_huiwu_file(huiwu_cookie, pageNum, false, 'shouwen')
                };
                btElement.parentNode.replaceChild(update_doc, btElement.nextSibling);
            }

            handleTableAfterRefresh();
            handleTotalMarkRefresh();
            // 目标：监听表格容器，当表格变化（翻页）时执行JS逻辑
            const observer = new MutationObserver(function (mutations) {
                setTimeout(() => {
                    const table = document.querySelector('#example');
                    if (table) {
                        //console.log('表格已刷新，重新执行JS逻辑');
                        const dataRows = table.querySelectorAll('tbody tr');
                        const thirdTd = dataRows[0].querySelectorAll('td')[2];
                        if (thirdTd.textContent.trim().includes(")标记") || thirdTd.textContent.trim().includes(")取消标记")) {
                            return
                        }
                    }
                    handleTableAfterRefresh();
                    // 停止观察（如果只需要执行一次）
                    //observer.disconnect();
                }, 100);

            });

            // 开始监听表格的父容器（替换为你的实际容器）
            const tableContainer = document.querySelector('.content');
            observer.observe(tableContainer, {
                childList: true,  // 监听子节点变化
                subtree: true,    // 监听所有后代节点
            });
        }, 100); // 延迟 1 毫秒（根据实际加载时间调整）

        // 表格处理逻辑
        function handleTableAfterRefresh() {
            const table = document.querySelector('#example');
            if (!table) return;
            const dataRows = table.querySelectorAll('tbody tr');
            //console.log(dataRows); // 再次检查
            dataRows.forEach((row, index) => {

                const link = document.createElement("a");
                link.textContent = "标记";
                link.dataset.rowIndex = index; // 存储行号（从0开始）
                link.style.backgroundColor = "";
                link.href = "javascript:void(0);"; // 防止默认跳转行为
                link.style.color = '#007DDB'
                link.id = 'mark'
                link.onclick = function () {
                    const rowNum = this.dataset.rowIndex;
                    const docTime = dataRows[rowNum].querySelectorAll('td')[4].textContent.trim();
                    let title = dataRows[rowNum].querySelectorAll('td')[2].textContent.trim();
                    title = handleTitle(title)

                    if (row.style.backgroundColor === 'rgb(249, 236, 195)') {
                        row.style.backgroundColor = '';
                        this.textContent = "标记";
                        markdata = markdata.filter(item => item.docTime !== docTime);
                        // 可试试localStorage
                        sessionStorage.setItem('markdata', JSON.stringify(markdata))
                        handleTotalMarkRefresh();
                        //console.log(markdata)
                    } else {
                        row.style.backgroundColor = 'rgb(249, 236, 195)';
                        this.textContent = "取消标记";
                        if (!markdata.some(item => item.docTime === docTime)) {
                            markdata.push({ "title": title, "docTime": docTime, });
                        }
                        sessionStorage.setItem('markdata', JSON.stringify(markdata))
                        handleTotalMarkRefresh();
                        //console.log(markdata)
                    }
                };
                // 获取第三列（索引2）并添加按钮
                const actionCell = row.cells[2];
                actionCell.appendChild(link);

                if (markdata.length != 0) {
                    markdata.forEach((mark, index) => {
                        if (mark.docTime === row.querySelectorAll('td')[4].textContent.trim()) {
                            row.style.backgroundColor = 'rgb(249, 236, 195)';
                            const link = row.querySelector('#mark')
                            link.textContent = "取消标记"
                        }
                    })
                }

                const span1 = document.createElement("span");
                span1.textContent = " || "
                span1.id = "span1"
                actionCell.appendChild(span1);

                const link_oa = document.createElement("a");
                link_oa.textContent = "上OA";
                link_oa.dataset.rowIndex = index;
                link_oa.style.backgroundColor = "";
                link_oa.href = "javascript:void(0);"; // 防止默认跳转行为
                link_oa.style.color = '#007DDB'
                link_oa.id = 'to_oa'

                link_oa.onclick = function () {
                    const rowNum = this.dataset.rowIndex;
                    let title = dataRows[rowNum].querySelectorAll('td')[2].textContent.trim();
                    title = handleTitle(title)
                    const from = dataRows[rowNum].querySelectorAll('td')[1].textContent.trim();
                    const docTime = dataRows[rowNum].querySelectorAll('td')[4].textContent.trim();

                    const firstTd = row.querySelector('td');
                    const spanElement = firstTd.querySelector('span');
                    const titValue = spanElement.getAttribute('tit');
                    console.log(titValue);

                    const huiwu_cookie = document.cookie
                    const response_oa = fetch('http://127.0.0.1:7788/download/huiwuFile', {
                        method: 'POST',
                        headers: { 'Content-Type': 'application/json' },
                        body: JSON.stringify({ huiwu_cookie: huiwu_cookie, rKey: titValue, fileTitle: title })
                    }).then(response => {
                        if (!response.ok) {
                            throw new Error(`HTTP error! Status: ${response.status}`);
                        }
                        return response.json(); // 假设服务器返回 JSON，不能少，否则无法获取data
                    })
                        .then(data => {
                            if (data['status'] == 'success') {
                                console.log('下载成功:', data);
                                console.log('是否需要更新文档：' + data['if_update_file']);
                                if (data['if_update_file']) {
                                    alert("注意及时更新收文本！")
                                    // 自动更新
                                    //update_huiwu_file(huiwu_cookie, '1-10', true) //注意有时候页码没有这么多
                                    //update_oa_file(GM_getValue('oa_cookie'), '1-10', true)
                                }
                            } else {
                                console.log('下载失败:', data);
                            }
                            // 在这里添加通知处理结果的逻辑（如更新 UI 或显示提示）
                        })
                        .catch(error => {
                            console.error('请求失败:', error);
                            alert('后端未启动或程序出错')
                            // 在这里添加错误处理逻辑（如显示错误提示）
                        });

                    let jsonData = [];
                    jsonData.push({ "title": title, "from": from })
                    GM_setValue('jsonData', jsonData);
                    GM_setValue('toOAFlag', true);
                    window.open('http://*********/admin.php?ac=add&fileurl=apps&tpltype=1&tplid=1&type=0&is_type=1', '_blank');
                }
                actionCell.appendChild(link_oa);
            });
        }

        function handleTotalMarkRefresh() {

            // 获取ID为title的元素
            const titleElement = document.getElementById('zb2');

            // 在元素后面插入文字（作为下一个兄弟节点）
            const num = markdata.length
            const newText = document.createElement('span');
            newText.style.padding = '5px';
            newText.textContent = '共有' + num + '份已标记';
            Object.assign(newText.style, {
                color: '#e8b004',
                marginLeft: '10px',
                fontWeight: 'bold'
            });

            // 获取要插入a标签的容器
            const spanA = document.createElement('span');
            spanA.className = 'links-container'; // 添加 CSS 类
            spanA.id = 'dynamic-links'; // 可选：设置 ID

            // 遍历markdata，为每组数据创建a标签
            let i = 1;
            markdata.forEach(item => {
                const a = document.createElement('a');
                a.href = '#'; // 设置链接地址，根据需求修改
                a.textContent = i; // 设置显示文本
                a.style.color = '#e8b004'
                a.style.margin = '5px'; // 现在会生效
                //添加点击事件
                a.addEventListener('click', (e) => {
                    //console.log('点击了:', item.title, '时间:', item.docTime);
                    // 获取 input 元素
                    const inputElement = document.getElementById('sche');
                    // 设置 value 值
                    inputElement.value = item.title;
                    // tabrep();
                });
                // 将a标签添加到容器中
                spanA.appendChild(a);

                i = i + 1
            })
            newText.appendChild(spanA);
            const spanAT = document.createElement('span');
            spanAT.textContent = '（关闭浏览器会清空所有标记）';
            spanA.appendChild(spanAT);

            titleElement.parentNode.replaceChild(newText, titleElement.nextSibling);
        }
    } else if (currentUrl.startsWith('http://*********/newstart.php')) {
        const oa_cookie = document.cookie
        console.log("保存oa_cookie")
        GM_setValue('oa_cookie', oa_cookie);
    } else if (currentUrl == "http://*********/admin.php?ac=list&fileurl=apps") {
        // 添加导出oa文档
        const oabtn = document.getElementsByClassName('btn-info')
        if (oabtn[0].innerText == "导出查询结果") {
            const oa_update = document.createElement('a');
            oa_update.style = "margin-left: 5px"
            oa_update.classList.add("btn");
            oa_update.classList.add("btn-warning");
            oa_update.innerText = "更新OA收文本";
            oabtn[0].insertAdjacentElement('afterend', oa_update);
            oa_update.onclick = function () {
                let pageNum = prompt("请输入页码（如 1-9 或 3 ）:", "");
                console.log("pageNum：" + pageNum)
                if (pageNum == '' || pageNum === null) {
                    return
                }
                update_oa_file(document.cookie, pageNum, false)
            }
        }
    } else if (currentUrl == "https://*********/vcmeet/page/receivedmt2index.html") {
        console.log("归档页面")
        //添加更新收文本
        const huiwu_cookie = document.cookie
        const btElement = document.getElementById('zb');
        if (btElement) {
            const update_doc = document.createElement("button");
            update_doc.innerHTML = "<i class='fa fa-arrow-circle-o-down mr8'></i>导出收文本";
            update_doc.id = 'updateDoc'
            update_doc.classList.add("news-btn");
            update_doc.classList.add("news-btn-blue");
            update_doc.onclick = function () {
                let pageNum = prompt("建议文件全部处理完后再导出。\n请输入页码（如 1-9 或 3 ）:", "");
                console.log("pageNum：" + pageNum)
                if (pageNum == '' || pageNum === null) {
                    return
                }
                update_huiwu_file(huiwu_cookie, pageNum, false, 'guidang')
            };
            btElement.parentNode.replaceChild(update_doc, btElement.nextSibling);
        }
    } else {
        setTimeout(() => {
            // 快速添加责任科室
            const buttons = document.getElementsByClassName('btn')

            if (!buttons || buttons[3].innerHTML !== '返回') {
                console.error('未找到按钮（返回）！');
            } else {
                const selectContainer = document.createElement('span');
                selectContainer.style = 'margin-left:10px;'
                const select = document.createElement('select');
                select.style = 'width:180px'
                // 添加默认选项
                select.innerHTML = '<option value="">--快速填充拟办意见--</option>';

                fetch('http://127.0.0.1:7788/getdata/zrks/codeName') // 替换为你的后端 API 端点
                    .then(response => {
                        if (!response.ok) {
                            throw new Error('网络响应不正常');
                        }
                        return response.json();
                    })
                    .then(data => {
                        // 假设后端返回的数据格式为 [{code: "jbgs", name: "局办公室"}, ...]
                        // console.log(data)
                        data['zrks_codeName'].forEach(department => {
                            const option = document.createElement('option');
                            option.value = department.code;
                            option.textContent = department.name;
                            select.appendChild(option);
                        });
                    })
                    .catch(error => {
                        console.error('获取部门数据失败:', error);
                        // 可以在这里添加错误处理，比如显示错误信息
                    });
                /**
                select.innerHTML = `
                    <option value="">--快速填充拟办意见--</option>
                    <option value="jbgs">局办公室</option>
                    <option value="jbgsaqsc">局办公室（安全生产）</option>
                    <option value="jbgscw">局办公室（财务）</option>
                    <option value="jbgsrs">局办公室（人事）</option>
                    <option value="jgdw">机关党委</option>
                    <option value="gxk">高新科</option>
                    <option value="cxyk">产学研科</option>
                    <option value="cgk">成果科</option>
                    <option value="fgk">法规科</option>
                    <option value="snk">社农科</option>
                    <option value="qbs">情报所</option>
                    <option value="zjk">专家科</option>
                    <option value="dzjczx">地震检测中心</option>
                    <option value="jfwh">局妇委会</option>
                    <option value="jgh">局工会</option>
                    `;
                **/
                selectContainer.appendChild(select);
                buttons[3].insertAdjacentElement('afterend', selectContainer);
                select.addEventListener('change', (e) => {
                    console.log('你选择了: ' + e.target.value);
                    if (e.target.value == '') {
                        return
                    }
                    const response_huiwu = fetch('http://127.0.0.1:7788/getdata/zrks', {
                        method: 'POST',
                        headers: { 'Content-Type': 'application/json' },
                        body: JSON.stringify({ zrks: e.target.value })
                    }).then(response => {
                        if (!response.ok) {
                            throw new Error(`HTTP error! Status: ${response.status}`);
                        }
                        return response.json(); // 服务器返回 JSON
                    })
                        .then(data => {
                            if (data['status'] == 'success') {
                                // console.log('获取成功:', data);
                                const editor = CKEDITOR.instances["toa_0668_20180911110644"]
                                if (editor) {
                                    const iframeDoc = editor.document.$;
                                    const pTag = iframeDoc.querySelector("body.cke_editable p");
                                    if (pTag) {
                                        pTag.innerHTML = data['zrks_txt'].replace(/\n/g, "<br>");
                                    }
                                }
                            } else {
                                console.log('请检查参考文件')
                            }
                        })
                        .catch(error => {
                            console.error('请求失败:', error);
                            alert('后端未启动或程序出错')
                            // 在这里添加错误处理逻辑（如显示错误提示）
                        });
                })
            }
            //console.log("toOAFlag: ", GM_getValue('toOAFlag'))
            if (GM_getValue('toOAFlag') === false) {
                //console.log("停止执行")
                return
            }

            const jsonData = GM_getValue('jsonData')
            const deptMapping = {
                "市发展改革局": "市发改局",
                "市工业和信息化局": "市工信局",
                "市住房城乡建设局": "市住建局",
                "市机关事务管理局": "市机关事务管",
                "市人大常委会办公室": "市人大常委办",
                "市政府办公室": "市府办",
                "市应急管理局": "市应急局",
                "市市场监督管理局": "市市场监管局",
                "百千万指挥办": "市百千万指挥办",
                "市人力资源社会保障局": "市人社局",
                "市卫生健康局": "市卫健局",
                "市直机关工委": "市直工委"
            };
            jsonData[0].from = deptMapping[jsonData[0].from] || jsonData[0].from;

            // name为title的input 标题
            const titleInput = document.querySelector('input[name="title"]');
            const title2Input = document.querySelector('input[name="toa_9295_20180911110548"]')

            if (titleInput.value !== "") {
                //console.log("停止执行")
                return
            }

            titleInput.value = jsonData[0].title;
            title2Input.value = jsonData[0].title;

            // name为toa_0865_20180911110526的input 来文单位
            const fromInput = document.querySelector('input[name="toa_0865_20180911110526"]');
            fromInput.value = jsonData[0].from;

            //等待 CKEditor 完全加载
            CKEDITOR.on("instanceReady", function (event) {
                const editor = event.editor;
                if (editor.name === "toa_0582_20180911110628") {
                    // 2. 获取 CKEditor 的 iframe 文档
                    const iframeDoc = editor.document.$; // CKEditor 4 的 iframe document
                    // 3. 修改 <p> 标签
                    const pTag = iframeDoc.querySelector("body.cke_editable p");
                    //pTag.textContent = "通过 CKEditor API 修改的内容";
                    pTag.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;" + jsonData[0].from + "来文，";
                    GM_setValue('toOAFlag', false);
                }
            });
        }, 500)
    }
})();